
// LAB颜色空间的距离权重 (基于感知重要性)
#define L_WEIGHT 0.33
#define A_WEIGHT 0.33
#define B_WEIGHT 0.33

// 终端调色板的LAB值 (预计算)
__constant float palette_lab[16][3] = {
    {0.0, 0.0, 0.0},      // 黑
    {25.0, 48.0, 38.0},   // 暗红
    {46.0, -51.0, 49.0},  // 暗绿
    {51.0, -12.0, 56.0},  // 暗黄
    {12.0, 47.0, -64.0},  // 暗蓝
    {29.0, 58.0, -36.0},  // 暗紫
    {48.0, -28.0, -21.0}, // 暗青
    {67.0, 48.0, 31.0},   // 亮粉红
    {88.0, -66.0, 63.0},  // 亮青绿
    {97.0, -21.0, 94.0},  // 亮黄
    {54.0, 28.0, -65.0},  // 亮蓝
    {70.0, 83.0, -43.0},  // 亮紫
    {91.0, -48.0, -14.0}, // 亮青
    {85.0, 20.0, 34.0},   // 肉色
    {95.0, -40.0, 35.0},  // 薄荷绿
    {100.0, 0.0, 0.0}     // 白
};

// 终端调色板的RGB值
__constant uchar palette_rgb[16][3] = {
    {0, 0, 0},       // 黑
    {128, 0, 0},     // 暗红
    {0, 128, 0},     // 暗绿
    {128, 128, 0},   // 暗黄
    {0, 0, 128},     // 暗蓝
    {128, 0, 128},   // 暗紫
    {0, 128, 128},   // 暗青
    {255, 100, 100}, // 亮粉红
    {100, 255, 100}, // 亮青绿
    {255, 255, 100}, // 亮黄
    {100, 100, 255}, // 亮蓝
    {255, 100, 255}, // 亮紫
    {100, 255, 255}, // 亮青
    {255, 200, 150}, // 肉色
    {200, 255, 200}, // 薄荷绿
    {255, 255, 255}  // 白
};

__kernel void terminal_filter(__global const float *input_lab,
                              __global uchar *output_rgb,
                              const int width,
                              const int height)
{
    int x = get_global_id(0);
    int y = get_global_id(1);

    if (x >= width || y >= height)
        return;

    int idx = y * width + x;
    float L = input_lab[idx * 3];
    float A = input_lab[idx * 3 + 1];
    float B = input_lab[idx * 3 + 2];

    // 查找最接近的终端颜色 (使用加权LAB距离)
    float min_dist = 1e9;
    int best_index = 0;

    // 跳过纯黑色(索引0)作为候选
    for (int i = 1; i < 16; i++)
    {
        if (palette_lab[i][0] == 0 && palette_lab[i][1] == 0 && palette_lab[i][2] == 0)
        {
            continue;
        }
        float dL = L - palette_lab[i][0];
        float dA = A - palette_lab[i][1];
        float dB = B - palette_lab[i][2];

        // 加权欧氏距离 (LAB空间)
        float dist = L_WEIGHT / 3 * dL * dL +
                     A_WEIGHT / 3 * dA * dA +
                     B_WEIGHT / 3 * dB * dB;

        if (dist < min_dist)
        {
            min_dist = dist;
            best_index = i;
        }
    }

    // 特殊处理：只有非常暗的像素才使用纯黑
    if (L < 5.0)
    {
        best_index = 0;
    }

    // 输出RGB颜色
    int out_idx = idx * 3;
    output_rgb[out_idx] = palette_rgb[best_index][0];
    output_rgb[out_idx + 1] = palette_rgb[best_index][1];
    output_rgb[out_idx + 2] = palette_rgb[best_index][2];
}